//数组去重 
//参数一 数组  PS:如果为普通数组则不需要参数二
//参数二 需要去重的字段  PS:对象数组才需要参数二
// [
//     { name: "a", age: 1 },
//     { name: "a", age: 2 },
//     { name: "b", age: 3 }
// ]
// 目标:去重name  则参数二为 “name”
export function unique(arr, key) {
    if (!arr) return arr;
    if (key === undefined) return [...new Set(arr)];
    const map = {
        string: (e) => e[key],
        function: (e) => key(e),
    };
    const fn = map[typeof key];
    const obj = arr.reduce((o, e) => ((o[fn(e)] = e), o), {});
    return Object.values(obj);
}

//时间戳转日期格式
//参数一 需要转换为的格式   例:"YYYY-mm-dd HH:MM:SS"
//参数二 日期对象 new Date(时间戳)   例:new Date(1661830624000) PS:时间戳需要为毫秒
export function dateFormat(fmt, date) {
    if (date instanceof Date && !isNaN(date.getTime())) {
        let ret;
        const opt = {
            "Y+": date.getFullYear().toString(), // 年
            "m+": (date.getMonth() + 1).toString(), // 月
            "d+": date.getDate().toString(), // 日
            "H+": date.getHours().toString(), // 时
            "M+": date.getMinutes().toString(), // 分
            "S+": date.getSeconds().toString(), // 秒
            // 有其他格式化字符需求可以继续添加，必须转化成字符串
        };
        for (const k in opt) {
            ret = new RegExp("(" + k + ")").exec(fmt);
            if (ret) {
                fmt = fmt.replace(
                    ret[1],
                    ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0")
                );
            }
        }
        return fmt;
    } else {
        return "";
    }
}

//将对象数组每条数据的key转成英文 一般用于表格数据导出为Excel文件
//参数一 对象数组          例:[{name:"gyh",age:18},{name:"xxx",age:20}]
//参数二 中英文key对应表    例:{name:"名字",age:"年龄"}
export function convertKey(tableData, list) {
    let newTableData = [];
    for (let item of tableData) {
        let obj = {};
        let keys = Object.keys(list);
        for (let itemTow of keys) {
            let enKey = list[itemTow];
            obj[enKey] = item[itemTow];
        }
        newTableData.push(obj);
    }
    return newTableData;
}

//字符串导出为text文件
//参数一 字符串
//参数二 文件名  例:"aaa.txt"
export function strToTextFile(data, name) {
    let urlObject = window.URL || window.webkitURL || window;
    let export_blob = new Blob([data]);
    let save_link = document.createElementNS(
        "http://www.w3.org/1999/xhtml",
        "a"
    );
    save_link.href = urlObject.createObjectURL(export_blob);
    save_link.download = name;
    save_link.click();
}

//将对象数组导出为Excel文件
//注意本方法需要导入依赖xlsx   import XLSX from "xlsx";
//参数一 对象数组     如需要将每条数据的英文key转换为中文key 请看52行
//参数二 文件名       例:"aaa.xls"
//参数三 表名         例:"数据详情"   可不填入 默认为 gyh
export function exportToExcel(tableData, name, tableName) {
    // 新建空workbook，然后加入worksheet
    const ws = XLSX.utils.json_to_sheet(tableData);
    // 设置每列的列宽，10代表10个字符，注意中文占2个字符
    let arr = [];
    for (let item of tableData) {
        arr.push({ wch: 10 });
    }
    ws["!cols"] = arr;
    // 新建book
    const wb = XLSX.utils.book_new();
    // 生成xlsx文件(book,sheet数据,sheet命名)
    XLSX.utils.book_append_sheet(wb, ws, tableName || "gyh");
    // 写文件(book,xlsx文件名称)
    XLSX.writeFile(wb, name);
}

//无需参数获取本月第一天00:00到本月最后一天23:59:59
//参数一  时间戳  例: 1659283199000  PS:传入参数则获取时间戳月的第一天00:00到最后一天23:59:59
export function getDateScope(timeData) {
    let data = timeData ? new Date(timeData) : new Date(); //本月
    data.setDate(1);
    data.setHours(0);
    data.setSeconds(0);
    data.setMinutes(0);
    let data1 = timeData ? new Date(timeData) : new Date(); // 下月
    // if (data.getMonth() == 11) {
    //     data1.setMonth(0)
    // } else {
    data1.setMonth(data.getMonth() + 1)
    // }
    data1.setDate(1);
    data1.setHours(0);
    data1.setSeconds(0);
    data1.setMinutes(0);


    let timeStart = parseInt(data.getTime() / 1000);
    let timeEnd = parseInt(data1.getTime() / 1000) - 1;//(计算下月1号时间戳-1即可)
    return [timeStart * 1000, timeEnd * 1000]
}
